#ifndef _MONITOR_H
#define _MONITOR_H

#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/reg.h>
#include <signal.h>
#include <errno.h>
#include <linux/user.h>
//#include <sys/user.h>
#include <sched.h>
#include <string.h>
#include <asm/unistd.h>
#include <sys/stat.h>
#include <limits.h>
#include <linux/net.h>

struct proc_info
{
        pid_t pid;
        pid_t ppid;
        int syscall_no; //current sys call
        int entry_flag; // 0 - no sys call, 1 - after enter to a sys call
	int aborted;
};

int getdata(pid_t pid, long addr,char *buf, int len);
int getstring(pid_t pid,long addr,char *buff,int len);
int getregs(pid_t pid, struct user_regs_struct *regs);
long getsyscall(pid_t pid);
int getsignal(pid_t pid,siginfo_t *signal_data);

int add_proc(pid_t pid,pid_t ppid,int syscall_no,int entry_flag);
int lookup_proc(pid_t pid);
int remove_proc(pid_t pid);

pid_t get_ppid(pid_t pid);
uid_t get_uid(pid_t pid);
uid_t get_euid(pid_t pid);
gid_t get_gid(pid_t pid);
gid_t get_egid(pid_t pid);
int get_appname(pid_t pid, char *appname);

void handle_open(pid_t pid);
void handle_creat(pid_t pid);
void handle_mkdir(pid_t pid);
void handle_symlink(pid_t pid);
void handle_link(pid_t pid);
void handle_rename(pid_t pid);
void handle_unlink(pid_t pid);
void handle_chmod(pid_t pid);
void handle_chown(pid_t pid);
void handle_rmdir(pid_t pid);
void handle_stat64(pid_t pid);
void handle_exec(pid_t pid);
void handle_socketcall(pid_t pid);
void handle_other_call(pid_t pid,int syscall);

void absolute_path(char *orig, char *dest,pid_t pid);
int get_cwd(pid_t pid,char *cwd);
int abort_syscall(int syscall, int index);
int change_return_value(pid_t pid, long error);

#endif
